import defineReactiveData from './reactive'
import { arrMethods } from './array'
import observeArr from './observeArr'

function Observer(data) {
  if (Array.isArray(data)) {
    // 首先 7 种 改变原数组的方法
    // push/pop/shift/unshift/splice/sort/reserver
    data.__proto__ = arrMethods
    // 可能 数组中为嵌套的数组
    observeArr(data)
  } else {
    this.walk(data)
  }
}

// 将对象所有的 key 和 value 重新定义
Observer.prototype.walk = function (data) {
  var keys = Object.keys(data)

  for (var i = 0; i < keys.length; i++) {
    var key = keys[i],
      value = data[key]

    defineReactiveData(data, key, value)
  }
}

// 对于对象和数组处理方法不一样
// object {} 可以用 Object.defineProperty() 进行处理
// array [] 需要自行处理

export default Observer